"""
Case Type   : 可靠性-数据库系统类
Case Name   : 数据库关闭，state文件损坏
Create At   : 2022/07/04
Owner       : @li-xin12345
Description :
    1.关闭正在运行的数据库
      gs_om –t stop
    2. 删除部分二进制文件内容，保存后退出
    3.开启数据库，查看文件是否更新
       gs_om –t start
Expect      :
    1.关闭正在运行的数据库成功
    2.删除部分二进制文件内容，保存后退出成功
    3.开启数据库成功
History     :
    Modified by peilinqian 6.0.0B001版本优化故障恢复场景，state文件故障，重启可自动恢复
"""
import os
import unittest

from yat.test import Node
from yat.test import macro

from testcase.utils.CommonSH import CommonSH
from testcase.utils.CommonSH import RestartDbCluster
from testcase.utils.Logger import Logger


class Dbsys(unittest.TestCase):
    nodes_tuple = ('PrimaryDbUser', 'Standby1DbUser', 'Standby2DbUser')

    @RestartDbCluster(*nodes_tuple)
    def setUp(self):
        self.logger = Logger()
        self.logger.info(f"-----{os.path.basename(__file__)} start-----")
        self.primary_node = Node('PrimaryDbUser')
        self.primary_sh = CommonSH('PrimaryDbUser')
        self.state_file = os.path.join(macro.DB_INSTANCE_PATH, 'gaussdb.state')
        self.state_file_bak = self.state_file.replace('state', 'state.bak')

        self.logger.info('-----备份gaussdb.state文件(防止异常）;expect:备份成功-----')
        cp_cmd = f'cp {self.state_file} {self.state_file_bak}'
        self.logger.info(cp_cmd)
        cp_msg = self.primary_node.sh(cp_cmd).result()
        self.logger.info(cp_msg)

    def test_dbsys(self):
        text = '-----step1:关闭正在运行的数据库;expect:关闭成功-----'
        self.logger.info(text)
        stop_msg = self.primary_sh.stopDbCluster()
        self.assertTrue(stop_msg, '执行失败' + text)

        text = '-----step2:删除部分二进制文件内容，保存后退出;' \
               'expect:删除部分二进制文件内容，保存后退出成功-----'
        self.logger.info(text)
        del_cmd = f"sed -i '1d' {self.state_file}"
        self.logger.info(del_cmd)
        del_msg = self.primary_node.sh(del_cmd).result()
        self.logger.info(del_msg)
        self.assertEqual(len(del_msg.strip()), 0, '执行失败' + text)

        text = '-----step3:开启数据库，查看文件是否更新;' \
               'expect:开启数据库成功-----'
        self.logger.info(text)
        start_msg = self.primary_sh.startDbCluster()
        self.assertTrue(start_msg, '执行失败' + text)

    def tearDown(self):
        self.logger.info(f"-----{os.path.basename(__file__)} end-----")
